<?php


namespace App\Services\Utils;


class VerifyDate
{

    /**
     * 日期检查
     *
     * @param $date
     * @return false|int[]|string|string[]
     * @author: lxk
     * @date: 2024-11-05 13:50
     */
    public static function check($date)
    {
        $date = format_str($date); //去掉可能出现的空字符和换行符
        if (empty($date)) {
            $res = false;
        } elseif (is_numeric($date)) {
            $res = self::dateFormat1($date);
        } elseif (str_contains($date, '～')) {
            $res = self::dateFormat2($date);
        } elseif (str_contains($date, '-')) {
            $res = self::dateFormat3($date);
        }
        return $res ?? false;
    }

    /**
     * 格式一纯数字 ：20190315 或者 201903
     *
     * @param $date
     * @return false|string
     * @author: lxk
     * @date: 2024-11-05 13:45
     */
    public static function dateFormat1($date)
    {
        $date = format_str($date); //去掉可能出现的空字符和换行符
        if ((date('Ymd', strtotime($date)) != $date) && (date('Ym', strtotime($date . '01')) != $date)) { //$date . '01' 是为了兼容 202305 这种合法年月
            $res = false;
        } elseif (date('Ymd', strtotime($date)) == '19700101') { //非法如：20160532
            $res = false;
        } else {
            $res = $date;
        }
        return $res;
    }

    /**
     * 格式二：20180919～20190315
     *
     * @param $date
     * @return false|int[]|string[]
     * @author: lxk
     * @date: 2024-11-05 13:46
     */
    public static function dateFormat2($date)
    {
        $len = strlen($date);
        if ($len != 19) {
            return false;
        }
        $pos = strpos($date, '～'); //获取连接符 - 的位置
        if (!$pos) { //如果不存在 ～
            return false;
        }
        $a = substr($date, 0, 2); //获取开始年的前两位
        $b = substr($date, $pos + 3, 2); //获取结束年的前两位
        if ($a != 20 || $b != 20) { //如果不是21世纪
            return false;
        }
        $startDate = substr($date, 0, $pos); //获取 ～ 前面的日期
        $endDate   = substr($date, $pos + 3); //获取 ～ 后面的日期
        if (strlen($startDate) != 8 || strlen($endDate) != 8) {
            return false;
        }
        if (!is_numeric($startDate) || !is_numeric($endDate)) { //如果不是数字
            return false;
        }
        if (strtotime($startDate) > strtotime($endDate)) { //如果开始日期大于结束日期
            return false;
        }
        return [
            'start_date' => $startDate,
            'end_date'   => $endDate,
        ];
    }

    /**
     * 格式三
     *
     * @param $date
     * @return false|int[]|string[]
     * @author: lxk
     * @date: 2024-11-05 13:47
     */
    public static function dateFormat3($date)
    {
        $len = strlen($date);
        if ($len != 17) {
            return false;
        }
        $pos = strpos($date, '-'); //获取连接符 - 的位置
        $a   = substr($date, 0, 2); //获取开始年的前两位
        $b   = substr($date, $pos + 1, 2); //获取结束年的前两位
        if ($a != 20 || $b != 20) { //如果不是21世纪
            return false;
        }
        $startDate = substr($date, 0, $pos); //获取 - 前面的日期
        $endDate   = substr($date, $pos + 1); //获取 - 后面的日期
        if (strlen($startDate) != 8 || strlen($endDate) != 8) {
            return false;
        }
        if (!is_numeric($startDate) || !is_numeric($endDate)) { //如果不是数字
            return false;
        }
        if (strtotime($startDate) > strtotime($endDate)) { //如果开始日期大于结束日期
            return false;
        }
        return [
            'start_date' => $startDate,
            'end_date'   => $endDate,
        ];
    }

}
